/*
 * Clase para manejar los usuarios de la Web de Marca.com
 */

package com.bitoon.basketdudes.ws;

import com.bitoon.basketdudes.jpa.Usuario;
import com.bitoon.basketdudes.jpa.MarcaUser;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.*;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import org.apache.log4j.*;
import org.jdom.Document;
import org.jdom.input.SAXBuilder;


/**
 *
 * @author paco FELC 2012
 */
public class MarcaCom {

    Logger     m_log = Logger.getLogger(DatosEquipo.class);
    private final static String location = "http://app.marca.com/registro/ext/basketdudes/login.html";

    public Usuario login ( EntityManager em, String p_nick, String p_password ) {
        Usuario             usuario =null;
        HttpURLConnection   huc     =null;

        try {
m_log.debug("[DEBUG][MarcaCom.Login]: " + p_nick + " passwd: " + p_password );

            // Hacemos una llamada a los WS de Marca
            String theXMLMessage = null;

            String urlParameters = "username="+p_nick+"&password="+p_password+"&servicio=4222";
            URL    url           = new URL(location);
            huc = (HttpURLConnection)url.openConnection();
            huc.setRequestMethod("POST");
            huc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            huc.setRequestProperty("charset", "utf-8");
            huc.setRequestProperty("Content-Length", "" + Integer.toString(urlParameters.getBytes().length));
            huc.setUseCaches (false);
            huc.setDoOutput(true);
            huc.setDoInput(true);
            huc.setInstanceFollowRedirects(false);

            DataOutputStream wr = new DataOutputStream(huc.getOutputStream ());
            wr.writeBytes(urlParameters);
            wr.flush();
            wr.close();

            SAXBuilder parser = new SAXBuilder();
            Document   doc    = parser.build(huc.getInputStream());

            String  url2    = doc.getRootElement().getValue();
            Integer valido = Integer.parseInt(doc.getRootElement().getChildText("valido"));

            String  desc_error=null;
            Integer user_marca_id=0;
            Integer retorno=0;
            if ( valido == 1 ) {
                user_marca_id = Integer.parseInt(doc.getRootElement().getChildText("nil"));
                String username = doc.getRootElement().getChildText("username");
                m_log.debug("[DEBUG][MarcaCom.Login 4]: " + user_marca_id + " " + username);
                try {
                    // Si la respuesta es correcta buscamos al usuario de Marca
                    // para localizar al usuario de BasketDudes que le corresponde
                    Query qv = em.createNamedQuery("MarcaUser.findByNick");
                    qv.setParameter("nick",  p_nick);

                    MarcaUser mu = (MarcaUser)qv.getSingleResult();

                    // Si la respuesta es correcta y el campo marca_id esta vacio lo actualizamos
                    if ( mu.getMarcaId()== null || mu.getMarcaId()==0 ) {
                        mu.setMarcaId(  user_marca_id  );
                    }
                    return mu.getUsuario();

                } catch (NoResultException nre) {
                    m_log.error("[Usuario correcto en Marca pero no existe en Basketdudes]: " +p_nick, nre);
                    return null;
                }
            } else {
                desc_error = doc.getRootElement().getChildText("error");
                m_log.debug("[DEBUG][MarcaCom.Login Error]: " + desc_error );
            }

        } catch(MalformedURLException mfue) {            
            m_log.error("[MalformedURLException]: ", mfue);
        } catch(IOException ioe) {
            m_log.error("[IOException]: ", ioe);
        } catch (Exception e) {
            try { em.getTransaction().rollback(); } catch (Exception e2) { }
            m_log.error("[MarcaCom.Login]: ", e);
        }

        if ( huc != null)
            huc.disconnect();
        return usuario;
    }

    /*
    * encodes a string to Base 64
    */
    public String encodeBase64(byte[] d) {
        if (d == null) return null;
        byte data[] = new byte[d.length+2];
        System.arraycopy(d, 0, data, 0, d.length);
        byte dest[] = new byte[(data.length/3)*4];

        // 3-byte to 4-byte conversion
        for (int sidx = 0, didx=0; sidx < d.length; sidx += 3, didx += 4){
            dest[didx]   = (byte) ((data[sidx] >>> 2) & 077);
            dest[didx+1] = (byte) ((data[sidx+1] >>> 4) & 017 | (data[sidx] << 4) & 077);
            dest[didx+2] = (byte) ((data[sidx+2] >>> 6) & 003 | (data[sidx+1] << 2) & 077);
            dest[didx+3] = (byte) (data[sidx+2] & 077);
        }

        // 0-63 to ascii printable conversion
        for (int idx = 0; idx <dest.length; idx++)
        {
            if (dest[idx] < 26)     dest[idx] = (byte)(dest[idx] + 'A');
            else if (dest[idx] < 52)  dest[idx] = (byte)(dest[idx] + 'a' - 26);
            else if (dest[idx] < 62)  dest[idx] = (byte)(dest[idx] + '0' - 52);
            else if (dest[idx] < 63)  dest[idx] = (byte)'+';
            else dest[idx] = (byte)'/';
        }

        // add padding
        for (int idx = dest.length-1; idx > (d.length*4)/3; idx--){
            dest[idx] = (byte)'=';
        }

        return new String(dest);
    }


}
